package com.itheima.d6_abstract_template;


/**
 * 模板方法模式主要解决方法中存在重复代码的问题
 *
 * 模板方法模式实现步骤
 * 1、定义一个抽象类。
 * 2、在里面定义2个方法（一个是模板方法：把相同代码放里面去，一个是抽象方法：具体实现交给子类完成）。
 * 3、定义子类继承抽象类，重写抽象方法。
 * 4、创建子类对象，调用模板方法完成功能。
 *
 * 第1步：定义一个抽象类，把子类中相同的代码写成一个模板方法。
 * 第2步：把模板方法中不能确定的代码写成抽象方法，并在模板方法中调用。
 * 第3步：子类继承抽象类，只需要父类抽象方法就可以了。
 *
 * 多学一招：建议使用final关键字修饰模板方法，为什么？
 * 模板方法是给对象直接使用的，不能被子类重写。
 * 一旦子类重写了模板方法，模板方法就失效了。
 */
public class Test {
    public static void main(String[] args) {
        // 目标：搞清楚抽象类的应用场景之一：经常用来设计模板方法设计模式。
        // 场景：
        //          学生，老师都要写一篇作文：我的爸爸
        //              第一段是一样的
        //              正文部分自由发挥
        //              最后一段也是一样的。

        /*Teacher t = new Teacher();
        t.write();*/

        People t = new Teacher();
        //t.test();  报错
        //((Teacher) t).test();  转换之后才能调用子类自己的方法
        t.writeMain();  //writeMain方法在父类是抽象方法，但是也可以调用子类的writeMain方法
        if(t instanceof Teacher){
            Teacher t1 =(Teacher) t;
            t1.write();
        }

        System.out.println("==========");

        Student s = new Student();
        s.write();
    }
}
